#include "Scene.h"

void Scene_amorcer() {}
void Scene_init() {}

void Scene_Tour_Suivant(t_liste* pRattaupe, t_motte** pMotte){
	//S'occupe du déplacement des rattaupes à chaque tour
	int eRattaupesNb=1;
	t_rattaupes Rattaupe;
	int ePosX, ePosY;
	char *sCommande=(char*)malloc(sizeof(char));
	t_rattaupes RattaupeMere;
	RattaupeMere.ePosX=0;

	en_tete(pRattaupe);

	while(!hors_liste(pRattaupe)){
		valeur_elt(pRattaupe,&Rattaupe);
		ePosX=Rattaupe.ePosX;
		ePosY=Rattaupe.ePosY;
		if(Rattaupe.Age==Adulte){
			RattaupeMere=Rattaupe;
			if(bDeplacement_possible(pMotte,ePosX,ePosY)){
				printf("Entrez le déplacement de votre taupe n°%i (%i,%i) : ",eRattaupesNb,ePosX,ePosY);
				if(Rattaupe.Sexe==Male) printf("male");
					else printf("femelle\nTemps avant de pouvoir procréer : %i tours,",6-Rattaupe.eDelaiGrossesse);
				printf(" Sante : %i%% \nhaut,bas,gauche ou droite \n",Rattaupe.eSante);
				sCommande=sDeplacEcrire(sCommande);
				while(!bDeplacement_possible_dir(pMotte,ePosX,ePosY,sCommande)){
					printf("Ce déplacement n'est pas possible pour votre taupe, réessayez \n");
					sCommande=sDeplacEcrire(sCommande);
				}
				Rattaupes_deplacement(pRattaupe, pMotte, ePosX, ePosY, sCommande);
			}
			else printf("Votre taupe ne peut pas bouger actuellement\n");
		}
		else {
			printf("Votre jeune taupe (%i,%i) va suivre sa mère\n",ePosX,ePosY);
			pMotte[ePosX][ePosY].eTaupes-=1;
			//On vérifie ici si la mère n'est pas morte en vérifiant si elle est autour du Rattaupe et juste avant dans la liste
			if(RattaupeMere.ePosX!=0&&RattaupeMere.eDelaiGrossesse<=3&&RattaupeMere.Age==Adulte&&RattaupeMere.Sexe==Femelle&&((RattaupeMere.ePosX==ePosX&&RattaupeMere.ePosY==ePosY)||((RattaupeMere.ePosX==ePosX+1||RattaupeMere.ePosX==ePosX-1||RattaupeMere.ePosX==ePosX)&&(RattaupeMere.ePosY==ePosY+1||RattaupeMere.ePosY==ePosY-1||RattaupeMere.ePosY==ePosY)))){
				pMotte[RattaupeMere.ePosX][RattaupeMere.ePosY].eTaupes+=1;
				Rattaupe.ePosX=RattaupeMere.ePosX;
				Rattaupe.ePosY=RattaupeMere.ePosY;
				modif_elt(pRattaupe,Rattaupe);
				printf("Encore %i tours avant que votre jeune taupe ne devienne adulte\n",4-Rattaupe.eGestation);
			}
			else {
				printf("La mère du petit est morte, il ne peut survivre seul !\n");
				oter_elt(pRattaupe);
			}
		}
		eRattaupesNb++;
		suivant(pRattaupe);
	}

	free(sCommande);
}

char* sDeplacEcrire (char *sCommande){
	//Demande l'utilisateur de rentrer une direction
	scanf("%s",sCommande);
	while(strcmp(sCommande,"haut")&&strcmp(sCommande,"bas")&&strcmp(sCommande,"gauche")&&strcmp(sCommande,"droite")){
		printf("Nous n'avons pas compris votre commande : haut,bas,gauche ou droite \n");
		scanf("%s",sCommande);
	}
	return sCommande;
}

int bDeplacement_possible(t_motte** pMotte, int ePosX, int ePosY){
	//Regarde si le rattaupe peut se déplacer ou non
	if(pMotte[ePosX+1][ePosY].eTaupes<2&&pMotte[ePosX+1][ePosY].eEtatterre!=Pierre) return 1;
	if(pMotte[ePosX][ePosY+1].eTaupes<2&&pMotte[ePosX][ePosY+1].eEtatterre!=Pierre) return 1;
	if(pMotte[ePosX-1][ePosY].eTaupes<2&&pMotte[ePosX-1][ePosY].eEtatterre!=Pierre) return 1;
	if(pMotte[ePosX][ePosY-1].eTaupes<2&&pMotte[ePosX][ePosY-1].eEtatterre!=Pierre)	return 1;

	printf("Votre taupe n'a aucun déplacement possible \n");
	return 0;
}

int bDeplacement_possible_dir(t_motte** pMotte, int ePosX, int ePosY, char* sCommande){
	//Vérifie que le déplacement demandé par l'utilisateur est possible
	if(strcmp(sCommande,"haut")==0){
		if(pMotte[ePosX-1][ePosY].eTaupes<2&&pMotte[ePosX-1][ePosY].eEtatterre!=Pierre) return 1;
	}
	else if (strcmp(sCommande,"bas")==0){
		if(pMotte[ePosX+1][ePosY].eTaupes<2&&pMotte[ePosX+1][ePosY].eEtatterre!=Pierre) return 1;
	}
	else if (strcmp(sCommande,"gauche")==0){
		if(pMotte[ePosX][ePosY-1].eTaupes<2&&pMotte[ePosX][ePosY-1].eEtatterre!=Pierre) return 1;
	}
	else if (strcmp(sCommande,"droite")==0){
		if(pMotte[ePosX][ePosY+1].eTaupes<2&&pMotte[ePosX][ePosY+1].eEtatterre!=Pierre) return 1;
	}

	return 0;
}

void Rattaupes_deplacement(t_liste* pRattaupe, t_motte** pMotte, int ePosX, int ePosY, char* sCommande){
	//S'occupe de déplacer le rattaupe en fonction de la demande de l'utilisateur
	pMotte[ePosX][ePosY].eTaupes-=1;
	t_rattaupes Rattaupe;
	valeur_elt(pRattaupe,&Rattaupe);

	if(strcmp(sCommande,"haut")==0){
		ePosX-=1;
		Rattaupe.ePosX=ePosX;
		Rattaupe.ePosY=ePosY;
	}
	else if (strcmp(sCommande,"bas")==0){
		ePosX+=1;
		Rattaupe.ePosX=ePosX;
		Rattaupe.ePosY=ePosY;
	}
	else if (strcmp(sCommande,"gauche")==0){
		ePosY-=1;
		Rattaupe.ePosX=ePosX;
		Rattaupe.ePosY=ePosY;
	}
	else if (strcmp(sCommande,"droite")==0){
		ePosY+=1;
		Rattaupe.ePosX=ePosX;
		Rattaupe.ePosY=ePosY;
	}

	modif_elt(pRattaupe,Rattaupe);
	pMotte[ePosX][ePosY].eTaupes+=1;
	Rattaupes_absorption(pRattaupe, pMotte, ePosX, ePosY);
}

void Rattaupes_absorption(t_liste* pRattaupe, t_motte** pMotte, int ePosX, int ePosY){
	//S'occupe de l'absorption des mottes de terre par les déplacements des rattaupes
	if(pMotte[ePosX][ePosY].eEtatterre!=Pierre&&pMotte[ePosX][ePosY].eEtatterre!=Rien){
		switch (pMotte[ePosX][ePosY].eEtatterre){
			case Plein : 	pMotte[ePosX][ePosY].eEtatterre=Moyen;
					break;
			case Moyen :	pMotte[ePosX][ePosY].eEtatterre=Petit;
					break;
			case Petit : 	pMotte[ePosX][ePosY].eEtatterre=Rien;
					break;
		}
		Nourriture_absorption(pRattaupe, pMotte, ePosX, ePosY);
	}
}

void Nourriture_absorption (t_liste* pRattaupe, t_motte** pMotte, int ePosX, int ePosY){
	//S'occupe de l'absorption de la nourriture lors des déplacements des rattaupes + supprime la nourriture ingérée et sante à 100%
	t_rattaupes Rattaupe;
	valeur_elt(pRattaupe,&Rattaupe);

	if(pMotte[ePosX][ePosY].Nourriture!=Vide){
		switch(pMotte[ePosX][ePosY].Nourriture){
			case Ver : printf("Votre Rattaupe s'est nourrit de Vers !\n"); break;
			case Plante : printf("Votre Rattaupe s'est nourrit de Plantes !\n"); break;
		}
		//eSante à 120 car décrémenté mais rattaupe vient de se nourrir donc il devient à 100% au début du tour
		Rattaupe.eSante=120;
		pMotte[ePosX][ePosY].Nourriture=Vide;
		pMotte[ePosX][ePosY].ptNourriture=0;
		modif_elt(pRattaupe,Rattaupe);
	}

}

void Sante_decremente (t_liste* pRattaupe, int eTour){
	//Décrémente la santé du rattaupe de 20% à chaque tour sauf 33% si grossesse en cours
	en_tete(pRattaupe);

	t_rattaupes Rattaupe;

	while(!hors_liste(pRattaupe)){
		valeur_elt(pRattaupe,&Rattaupe);
		if(Rattaupe.Age==Adulte){
			if(Rattaupe.eSante>0){
				if(Rattaupe.eGestation>0||(Rattaupe.eDelaiGrossesse<3&&eTour>=6&&Rattaupe.Sexe==Femelle)){
					if(Rattaupe.eSante==33)
						Rattaupe.eSante=0;
					else
						Rattaupe.eSante-=33;
				}
				else {
					Rattaupe.eSante-=20;
				}
				modif_elt(pRattaupe,Rattaupe);
			}
		}
		suivant(pRattaupe);
	}
}

void Mort_Rattaupe (t_motte** pMotte, t_liste* pRattaupe){
	//Tue un rattaupe quand sa santé est à 0%
	en_queue(pRattaupe);

	t_rattaupes Rattaupe;
    int eRattaupeMort = 0;
	while(!hors_liste(pRattaupe)){
		valeur_elt(pRattaupe,&Rattaupe);
		if(Rattaupe.eSante<=0){
			pMotte[Rattaupe.ePosX][Rattaupe.ePosY].eTaupes-=1;
			eRattaupeMort ++;
			oter_elt(pRattaupe);
		}
		else precedent(pRattaupe);
	}
	if(eRattaupeMort==1)
        printf("%i de vos rattaupes est mort !\n", eRattaupeMort);
    if(eRattaupeMort>1)
        printf("%i de vos rattaupes sont morts !\n", eRattaupeMort);
}

void Nourriture_decremente(t_motte** pMotte, int elmax, int ecmax){
	//Décremente l'état de la nourriture à chaque tour
	int eLigne, eColonne;
	for(eLigne=1;eLigne<elmax-1;eLigne++){
		for(eColonne=1;eColonne<ecmax-1;eColonne++){
			switch(pMotte[eLigne][eColonne].ptNourriture){
				case 40 : pMotte[eLigne][eColonne].ptNourriture-=40;
				case 70 : pMotte[eLigne][eColonne].ptNourriture-=30;
				case 100 : pMotte[eLigne][eColonne].ptNourriture-=30;

			}
			if(pMotte[eLigne][eColonne].ptNourriture==0)
				pMotte[eLigne][eColonne].Nourriture=Vide;
		}
	}
}

void Enceinte_incremente (t_liste* pRattaupe, int eTour){
	t_rattaupes Rattaupe;

	en_tete(pRattaupe);
	if(eTour!=0){ // Pas d'incrémentation à l'initialisation
		while(!hors_liste(pRattaupe)){
			valeur_elt(pRattaupe,&Rattaupe);
			//Si le sexe est Male et Age est Adulte et DelaiGrossesse <6
			if(Rattaupe.Sexe==Femelle&&Rattaupe.Age==Adulte&&Rattaupe.eDelaiGrossesse<6){
				Rattaupe.eDelaiGrossesse++;
				modif_elt(pRattaupe,Rattaupe);
			}
			if(Rattaupe.Sexe==Femelle&&Rattaupe.Age==Adulte&&Rattaupe.eGestation>0){
				Rattaupe.eGestation--;
				modif_elt(pRattaupe,Rattaupe);
			}
			suivant(pRattaupe);
		}
	}
}

void Rattaupe_Grandis(t_liste* pRattaupe){
	t_rattaupes Rattaupe;

	en_tete(pRattaupe);
	while(!hors_liste(pRattaupe)){
		valeur_elt(pRattaupe,&Rattaupe);
		if(Rattaupe.Age==Jeune){
			if(Rattaupe.eGestation==3){
				Rattaupe.Age=Adulte;
				Rattaupe.eGestation=0;
				Rattaupe.eDelaiGrossesse=0;
				modif_elt(pRattaupe,Rattaupe);
			}
			else{
				Rattaupe.eGestation+=1;
				modif_elt(pRattaupe,Rattaupe);
			}
		}
		suivant(pRattaupe);
	}
}
